<?php
	/**
	  * @package	PSQLWrapper
	  * @name		PSQLProcess
	  * @brief		Clase para ejecutar procesos en un servidor PostgreSQL (Solo procesos)
	  * @author		Hermann D. Schimpf <hschimpf@gschimpf.com>
	  * @license	http://opensource.org/licenses/gpl-2.0.php
	  * @date		2010-05-13
	  * @version	0.1.0
  	**/

	class PSQLProcess extends PSQLLink implements SQLBasics, MyVersions {
		/**
		  * Version de la clase
		  * @access	private
		  * @static
		  * @name	$version
		 **/
		private static $version			= 0;
		/**
		  * Subversion de la clase
		  * @access	private
		  * @static
		  * @name	$subversion
		 **/
		private static $subversion		= 1;
		/**
		  * Revision de la clase
		  * @access	private
		  * @static
		  * @name	$revision
		 **/
		private static $revision		= 0;

		/**
		  * Cadena para la consulta temporal
		  * @access	protected
		  * @name	$sqlString
		 **/
		protected $sqlString		= False;
		/**
		  * Resultados de la ultima consulta SQL ejecutada
		  * @access	protected
		  * @name	$sqlResult
		 **/
		protected $sqlResult		= False;
		/**
		  * Cantidad de filas afectadas en la ultima consulta SQL
		  * @access	protected
		  * @name	$affected
		 **/
		protected $affected		= False;

		/**
		  * Constructor de la clase
		  * @access	public
		  * @param	Boolean	Valor booleano para habilitar la depuracion de la clase
		  * @param	String	Nombre para la depuracion
		  * @return	void
		 **/
		public function __construct($debug = False, $name = __CLASS__) {
			/* enviamos el constructor del padre */
			parent::__construct($debug, $name);
		}

		/**
		  * Destructor de la clase
		  * @access	public
		  * @return	void
		 **/
		public function __destruct() {
			/* enviamos el destructor padre */
			parent::__destruct();
		}

		/**
		  * Metodo para obtener la version de la clase
		  * @access	public
		  * @static
		  * @return	String	Retorna la version de la clase con el formato: v{version}.{subversion}.{revision}
		 **/
		public static function getVersion() {
			/* retornamos la version actual de la clase */
			return 'v' . self::$version . '.' . self::$subversion . '.' . self::$revision;
		}

		/**
		  * Ejecutamos una consulta SQL
		  * @access	public
		  * @param	String	Cadena de la consulta SQL
		  * @return	void
		 **/
		public final function ejecutarSQL($sqlString = Null) {
			try {
				try {
					/* mostramos un mensaje */
					$this->show('Ejecutando consulta SQL..', False);
					/* realizamos unas verificaciones */
					$this->verificacionesEjecutarSQL($sqlString);
					/* verificamos si se especifico la consulta en el parametro */
					if ($sqlString !== Null)
						/* almacenamos la consulta */
						$this->saveValue('sqlString', $sqlString);
					/* ejecutamos el sql */
					$this->runSQL();
					/* mostramos ok al mensaje */
					$this->showOK();
				} catch (Exception $e) {
					/* convertimos la excepcion a mi excepcion */
					$this->newException($e);
				}
			} catch (MyException $e) {
				/* comstramos el mensaje */
				$this->show($e->getMensaje());
			}
		}

		/**
		  * Retornamos el resultado de la consulta SQL
		  * @access	public
		  * @return	Array	Resultados de la consulta
		 **/
		public final function getResultadoSQL() {
			try {
				try {
					/* mostramos un mensaje */
					$this->show('Enviando resultados de la consulta..', False);
					/* realizamos algunas verificaciones */
					$this->verificacionesResultadoSQL();
					/* obtenemos el resultado de la consulta */
					$resultado = pg_fetch_object($this->getSqlResult());
					/* mostramos ok al mensaje */
					$this->showOK();
					/* retornamos el resultado */
					return $resultado;
				} catch (Exception $e) {
					/* convertimos la excepcion a mi excepcion */
					$this->newException($e);
				}
			} catch (MyException $e) {
				/* comstramos el mensaje */
				$this->show($e->getMensaje());
			}
		}

		protected final function existeSQL() {
			/* retornamos True si hay un SQL */
			return (
				/* verificamos si existe una consulta */
				$this->getSqlString() === False ?
				/* retornamos FALSE */
				False :
				/* retornamos TRUE */
				True
			);
		}

		protected function consultaSinEjecutar($sqlString) {
			/* verificamos si hay un SQL que no se ejecuto y se especifico un nuevo SQL */
			if ($sqlString !== Null && $this->getSqlString() !== False)
				/* mostramos un mensaje */
				$this->show($this->red('Se sobreescribe el SQL no ejecutado..'), False);
		}

		protected function getSqlString() {
			/* retornamos la consulta temporal */
			return $this->getValue('sqlString');
		}

		protected function getSqlResult() {
			/* retornamos el resultado de la consulta */
			return $this->getValue('sqlResult');
		}

		private function verificacionesEjecutarSQL($sqlString) {
			/* verificamos si hay una conexion abierta */
			$this->verificarConexion();
			/* verificamos si hay una consulta para ejecutar */
			if ($sqlString === Null && $this->getSqlString() === False)
				/* salimos con una excepcion */
				$this->newException('No existe una consulta para ejecutar');
			/* verificamos si hay una consulta sin ejecutar */
			$this->consultaSinEjecutar($sqlString);
		}

		private function verificacionesResultadoSQL() {
			/* verificamos si existe una conexion abierta */
			$this->verificarConexion();
			/* verificamos si hay una consulta activa */
			if ($this->getSqlResult() === False)
				/* salimos con una excepcion */
				$this->newException('No existe una consulta activa');
		}

		private function runSQL() {
			/* mostramos el sql a ejecutar */
			$this->show('(' . $this->blue($this->italic($this->getSqlString())) . ')..', False);
			/* ejecutamos la consulta */
			$this->saveValue('sqlResult', pg_query($this->getLink(), $this->getSqlString()));
			/* verificamos si la consulta se ejecuto correctamente */
			if ($this->getSqlResult() === False)
				/* salimos con una excepcion */
				$this->newException('La consulta no se pudo ejecutar: ' . pg_last_error());
			/* verificamos el tipo de dato retornado por la consulta */
			if (gettype($this->getSqlResult()) !== 'boolean')
				/* vaciamos la cantidad de filas adectadas */
				$this->saveValue('affected', False);
			else {
				/* obtenemos la cantidad de filas afectadas */
				$this->saveValue('affected', pg_affected_rows());
				/* vaciamos el resultado del sql */
				$this->saveValue('sqlResult', False);
			}
			/* vaciamos el atributo con el sql temporal */
			$this->saveValue('sqlString', False);
		}
	}
?>